const crypto = require('crypto');
const express = require('express');

// 导入连接池(connection pool)
const pool = require('../db/mysql.js');
// 导入ID生成器(也可以生成盐值)
const uid = require( '../db/uid.js' );

const router = express.Router();

// 路由: 负责渲染注册页面 (GET)
router.get( '/customer/sign/up' , (req,resp)=>{
    if( req.session.customer ) {
        resp.redirect( '/topic/list' );
        return ;
    }
    resp.render( 'sign-up' );
});

// 路由: 检查注册表单上的数据是否合法
router.post( '/customer/sign/up' , (req,resp,next)=>{

    // 检查 账号 、 密码 是否为空

    // 检查 密码 和 确认密码 是否相同

    // 检查 账号 是否被占用

    next(); // 当所有数据都符合要求时执行下一个中间件
});

// 路由: 接受数据完成注册操作 (POST)
router.post( '/customer/sign/up' , (req,resp)=>{
    let account = req.body.account ;
    let password = req.body.password ;

    // 使用自定义的组件来创建盐值
    const salt = uid.saltGenerator();
    const passwd = crypto.createHmac( 'sha512' , salt ).update( password ).digest( 'hex' );

    const regexp = /^[\d]{11}$/;

    let sql ;
    if( regexp.test( account ) ) {
        sql = `INSERT INTO t_customers (id,tel,password,salt,regist_date) VALUES (?,?,?,?,?)` ;
    } else {
        sql = `INSERT INTO t_customers (id,email,password,salt,regist_date) VALUES (?,?,?,?,?)` ;
    }
    // 使用自定义组件来生成ID
    let params = [ uid.idGenerator() , account , passwd , salt , new Date() ] ;

    let handler = (error,results,fields) => {
        if( error ){
            console.log( error );
            resp.render( 'sign-up' );
            return ;
        }
        resp.redirect( '/customer/sign/in' );
    }
    pool.execute( sql , params , handler );
});

// 路由: 负责渲染登录页面 (GET)
router.get( '/customer/sign/in' , (req,resp)=>{
    if( req.session.customer ) {
        resp.redirect( '/topic/list' );
        return ;
    }
    resp.render( 'sign-in' );
});

// 路由: 检查登录表单上的数据是否合法
router.post( '/customer/sign/in' , (req,resp,next)=>{
    next();
});

// 路由: 实现登录操作
router.post( '/customer/sign/in' , (req,resp)=>{
    let account = req.body.account ;
    let password = req.body.password ;

    let sql = 'SELECT id , tel , email , nickname , password , salt ' +
              'FROM t_customers ' + 
              'WHERE tel = ? OR email = ? ' ;
    let params = [ account , account ];
    let handler = (error,results,fields)=> {
        if( error ){
            resp.render( 'sign-in' , { message: '登录失败' } );
            return ;
        }
        // 检查用户名是否存在于数据库中(若不存在则results数组为空数组)
        if( results.length == 0 ){
            resp.render( 'sign-in' , { message: '用户名不存在' } );
            return ;
        }

        // 从查询结果中获取惟一的那个对象
        const c = results[ 0 ] ;

        // 对用户在页面上输入的密码进行处理
        let passwd = crypto.createHmac( 'sha512' , c.salt ).update( password.trim() ).digest( 'hex' );

        // 检查密码是否【不正确】(对照数据库中存储的密码与将用户输入的经过处理后的密码是否不相等)
        if( c.password != passwd ){
            resp.render( 'sign-in' , { message: '密码错误' , account: c.tel ? c.tel : c.email } );
            return ;
        }
        
        // 如果用户名和密码都正确则将用户信息保存到会话中
        req.session.customer = c ;
        // 登录成功后去往主页面
        resp.redirect( '/topic/list' );
    }
    pool.execute( sql , params , handler );
});

// 路由: 实现注销操作
router.get( '/customer/sign/out' , (req,resp)=>{
    // 将会话中的customer删除
    delete req.session.customer ;
    // 重新返回到登录页面
    resp.redirect( '/customer/sign/in' );
});

module.exports = router ;